package cn.genmer.test.security.machinelearning.deeplearning4j.mnist.V2.strategy;


import org.nd4j.linalg.api.ndarray.INDArray;

import java.awt.image.BufferedImage;

/**
 * CNN: Convolutional Neural Network （卷积神经网络）
 * CNN是一种深度学习模型，主要用于处理具有网格结构数据（如图像）的任务。
 * 它使用卷积层和池化层来提取图像特征，并通过全连接层进行分类或回归等任务。
 * CNN在图像识别、目标检测和图像生成等领域取得了显著的成功。
 *
 * MLP: Multi-Layer Perceptron （多层感知器）
 * MLP是一种基本的前馈神经网络模型，由多个神经元层组成，每层神经元与下一层连接。
 * 它通过使用激活函数和反向传播算法来学习和逼近非线性函数。
 * MLP广泛应用于分类、回归和模式识别等任务。
 *
 * DAE: Denoising Autoencoder （去噪自编码器）
 * DAE是一种无监督学习模型，用于学习输入数据的紧凑表示，并减少输入中的噪声。
 * 它由编码器和解码器组成，编码器将输入数据映射到低维表示，解码器将低维表示重构为原始输入。
 * DAE可用于特征学习、数据去噪和降维等任务。
 *
 *
 * MNIST 使用策略
 * 主要区别在于:
 * 上一个模型使用的是一个卷积神经网络(CNN),输入是图像数据,第一个层是卷积层;而这个模型使用的是全连接网络(MLP),第一个层是DenseLayer,输入数据维度是28*28个像素值扁平化。
 * CNN使用的输入类型是convolutionalFlat,指定图像大小和通道数;MLP没有指定输入类型,默认是dense类型。
 * CNN中包含卷积层和池化层;MLP全是DenseLayer。
 * 其他超参数如优化器,正则化等设置基本一致。
 *
 * 所以总体来说:
 * 对于小型图像如MNIST,CNN效果明显优于MLP。
 * 如果一定要用MLP,需要更多隐层、节点来补足空间结构信息丢失。
 * 对比同样性能,CNN模型通常参数和计算更少。
 * 图像分类正是CNN处理效率最高的任务之一。
 */
public interface MnistModelStrategy {
  int predict(INDArray feature);
  INDArray loadImgAndGetFeature(BufferedImage image);
  INDArray loadImgAndGetFeature(String modelPath);
}